package org.lanyu.springainovel.common.util;

import org.lanyu.springainovel.common.dto.CustomUserDetails;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

/**
 * 安全上下文工具类
 * 提供便捷的方法获取当前用户信息
 */
public class SecurityContextUtil {

    /**
     * 获取当前认证的用户
     * @return CustomUserDetails对象，如果未认证则返回null
     */
    public static CustomUserDetails getCurrentUser() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null && authentication.isAuthenticated() 
            && authentication.getPrincipal() instanceof CustomUserDetails) {
            return (CustomUserDetails) authentication.getPrincipal();
        }
        return null;
    }

    /**
     * 获取当前用户ID
     * @return 用户ID，如果未认证则返回null
     */
    public static Long getCurrentUserId() {
        CustomUserDetails currentUser = getCurrentUser();
        return currentUser != null ? currentUser.getUserId() : null;
    }

    /**
     * 获取当前用户名
     * @return 用户名，如果未认证则返回null
     */
    public static String getCurrentUsername() {
        CustomUserDetails currentUser = getCurrentUser();
        return currentUser != null ? currentUser.getUsername() : null;
    }

    /**
     * 获取当前用户昵称
     * 
     * @return 用户昵称，如果用户未认证则返回null
     */
    public static String getCurrentNickname() {
        CustomUserDetails userDetails = getCurrentUser();
        return userDetails != null ? userDetails.getNickname() : null;
    }

    /**
     * 获取当前用户ID（必须存在）
     * 
     * @return 当前用户ID
     * @throws IllegalStateException 如果用户未认证
     */
    public static Long getRequiredCurrentUserId() {
        Long userId = getCurrentUserId();
        if (userId == null) {
            throw new IllegalStateException("用户未认证");
        }
        return userId;
    }

    /**
     * 获取当前用户（必须存在）
     * 
     * @return 当前用户详情
     * @throws IllegalStateException 如果用户未认证
     */
    public static CustomUserDetails getRequiredCurrentUser() {
        CustomUserDetails userDetails = getCurrentUser();
        if (userDetails == null) {
            throw new IllegalStateException("用户未认证");
        }
        return userDetails;
    }

    /**
     * 获取当前用户名（必须存在）
     * 
     * @return 当前用户名
     * @throws IllegalStateException 如果用户未认证
     */
    public static String getRequiredCurrentUsername() {
        String username = getCurrentUsername();
        if (username == null) {
            throw new IllegalStateException("用户未认证");
        }
        return username;
    }

    /**
     * 获取当前用户昵称（必须存在）
     * 
     * @return 当前用户昵称
     * @throws IllegalStateException 如果用户未认证
     */
    public static String getRequiredCurrentNickname() {
        String nickname = getCurrentNickname();
        if (nickname == null) {
            throw new IllegalStateException("用户未认证");
        }
        return nickname;
    }

    /**
     * 检查当前用户是否已认证
     * @return 如果已认证返回true，否则返回false
     */
    public static boolean isAuthenticated() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        return authentication != null && authentication.isAuthenticated() 
            && !"anonymousUser".equals(authentication.getPrincipal());
    }
}
